'use strict'

const { expect } = require('chai')
const overrideArgv = require('process-utils/override-argv')
const resolveInput = require('../../../../../lib/cli/resolve-input')
const renderHelp = require('../../../../../lib/cli/render-help')
const observeOutput = require('@serverless/test/observe-output')

describe('test/unit/lib/cli/render-help/index.test.js', () => {
  it('should show general help on main command', async () => {
    resolveInput.clear()
    overrideArgv(
      {
        args: ['serverless', '--help'],
      },
      () => resolveInput(),
    )
    const output = await observeOutput(() => renderHelp(new Set()))
    expect(output).to.have.string('Usage')
    expect(output).to.have.string('deploy function')
  })

  it('should show interactive help when requested', async () => {
    resolveInput.clear()
    overrideArgv(
      {
        args: ['serverless', '--help-interactive'],
      },
      () => resolveInput(),
    )
    const output = await observeOutput(() => renderHelp(new Set()))
    expect(output).to.have.string('Interactive CLI')
    expect(output).to.have.string('--help-interactive')
  })

  it('should show general help on help command', async () => {
    resolveInput.clear()
    overrideArgv(
      {
        args: ['serverless', 'help'],
      },
      () => resolveInput(),
    )
    const output = await observeOutput(() => renderHelp(new Set()))
    expect(output).to.have.string('Usage')
    expect(output).to.have.string('deploy function')
  })

  it('should show specific commmand help with specific command', async () => {
    resolveInput.clear()
    const { commandsSchema } = overrideArgv(
      {
        args: ['serverless', 'deploy', '--help'],
      },
      () => resolveInput(),
    )
    const output = await observeOutput(() => renderHelp(new Set()))
    expect(output).to.have.string('deploy')
    expect(output).to.have.string('deploy function')
    expect(output).to.have.string('--help')
    expect(output).to.have.string(commandsSchema.get('deploy').usage)
    expect(output).to.have.string(commandsSchema.get('deploy function').usage)
  })
})
